
//
//  UITableView+Adaptation.m
//  UITableViewDemo
//
//  Created by lg_wd on 2018/2/27.
//  Copyright © 2018年 lg_wd. All rights reserved.
//

#import "UITableView+Adaptation.h"
#import <objc/runtime.h>

@implementation UITableView (Adaptation)

+(void)load
{
    [self loadTable];
}


-(void)adaptationTableView
{
    //设置消除状态栏或底部小尾巴对tabView 或scrollView 的影响
    /*
     ios 11中automaticallyAdjustsScrollViewInsets属性被废弃，进而影响了tableview的内容高度。
     iOS11中新提出了安全区域的问题，如果没有控件内容和不可视区域重复的话，会自动下移到可视区域。
     */
    #ifdef __IPHONE_11_0
    if (@available(iOS 11.0, *)){
        self.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
        // //解决 iOS 11系统reloadData刷新 tableView闪动问题
        self.estimatedSectionFooterHeight = 0;
        self.estimatedSectionHeaderHeight = 0;
        self.estimatedRowHeight = 0;
    }
#endif
}

+(void)loadTable{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        SEL originalSelector = @selector(initWithFrame:style:);
        SEL swizzledSelector = @selector(mr_tableView_initWithFrame:style:);
        Method originalMethod = class_getInstanceMethod([self class], originalSelector);
        Method swizzledMethod = class_getInstanceMethod([self class], swizzledSelector);
        BOOL didAddMethod = class_addMethod([self class], swizzledSelector,method_getImplementation(swizzledMethod) , method_getTypeEncoding(swizzledMethod));
        if (didAddMethod)
        {
            class_replaceMethod([self class], swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
        }
        else
        {
            method_exchangeImplementations(originalMethod, swizzledMethod);
        }
    });
}
//
/**
 然而在交换了方法实现后就不会出现循环了。好的程序员应该对这里出现的方法的递归调用有所警觉，这里我们应该理清在 method swizzling 后方法的实现究竟变成了什么。在交换了方法的实现后，mr_tableView_initWithFrame:style:方法的实现已经被替换为了 UIViewController -initWithFrame:style:的原生实现，所以这里并不是在递归调用。由于 mr_tableView_initWithFrame:style: 这个方法的实现已经被替换为了 initWithFrame:style: 的实现，所以，当我们在这个方法中再调用 viewWillAppear: 时便会造成递归循环。
 
 #     https://nshipster.cn/method-swizzling/
 **/
-(instancetype)mr_tableView_initWithFrame:(CGRect)frame style:(UITableViewStyle)style{
    UITableView *tableview = [self mr_tableView_initWithFrame:frame style:style];
    if (tableview) {
        if (@available(iOS 11.0, *)) {
            tableview.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
        }
    }
    return tableview;
}

@end
